/*
 * Copyright 2010 Biz-e (info@biz-e.nl)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package nl.biz_e.acl.shared.model;

import javax.persistence.Id;

import nl.biz_e.appengine.lib.shared.objectify.IEntity;

import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Unindexed;

/**
 * An authorization(rule) describes the relation between a user (or usergroup)
 * and a specific context.<br/>
 * The user(group) can either be authorized (approved is true) or revoked
 * (approved is false).<br/>
 * If no instance of this class exists for the specific user(group)/context
 * combination, the user(group) is either not authorized, os some other rule
 * approves (or revokes) the combination. <br/>
 * For example, there might not be a rule for a user and a context, but there is
 * one for a group the user belongs to and the same context.<br/>
 * Another scenario might be a user with no rule for a specific context, but a
 * rule for the parent context.
 * 
 * @author Joost A. Bloemsma
 * 
 */
public class Authorization implements IEntity {
    private static final long serialVersionUID = 1L;
    @Id
    private Long id;
    private Key<User> user;
    private Key<UserGroup> userGroup;
    private Key<Context> context;
    @Unindexed
    private boolean approved = true;

    /**
     * @return the user
     */
    public Key<User> getUser() {
        return user;
    }

    /**
     * @param user
     *            the user to set
     */
    public void setUser(Key<User> user) {
        this.user = user;
    }

    /**
     * @return the userGroup
     */
    public Key<UserGroup> getUserGroup() {
        return userGroup;
    }

    /**
     * @param userGroup
     *            the userGroup to set
     */
    public void setUserGroup(Key<UserGroup> userGroup) {
        this.userGroup = userGroup;
    }

    /**
     * @return the context
     */
    public Key<Context> getContext() {
        return context;
    }

    /**
     * @param context
     *            the context to set
     */
    public void setContext(Key<Context> context) {
        this.context = context;
    }

    /**
     * @return the approved
     */
    public boolean isApproved() {
        return approved;
    }

    /**
     * @param approved
     *            the approved to set
     */
    public void setApproved(boolean approved) {
        this.approved = approved;
    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }
}
